package com.atwbj.langchain4jbeta3learndemo.controller;

import com.atwbj.langchain4jbeta3learndemo.service.RagAssistant;
import dev.langchain4j.data.document.Document;
import dev.langchain4j.data.document.loader.FileSystemDocumentLoader;
import dev.langchain4j.data.document.parser.apache.tika.ApacheTikaDocumentParser;
import dev.langchain4j.data.segment.TextSegment;
import dev.langchain4j.store.embedding.EmbeddingStoreIngestor;
import dev.langchain4j.store.embedding.inmemory.InMemoryEmbeddingStore;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.FileInputStream;
import java.io.IOException;

@RestController
@Slf4j
public class RAGController
{
    @Resource
    InMemoryEmbeddingStore<TextSegment> embeddingStore;

    @Resource
    RagAssistant chatAssistant;

        // http://localhost:9013/rag/add
    /**
     * 测试添加文档并进行聊天查询的功能
     * 该方法演示了从文件系统加载文档，将其嵌入到存储中，然后基于嵌入内容进行聊天查询的完整流程
     *
     * @return 聊天助手返回的查询结果字符串
     */
    @GetMapping(value = "/rag/add")
    public String testAdd()
    {
        // 从指定路径加载Word文档
        // 写法一： Document document = FileSystemDocumentLoader.loadDocument("D:\\44\\alibaba-java.docx");
        // FileInputStream 以字节流的方式读取文件内容
        // 写法二：更推荐使用ApacheTikaDocumentParser
        try (FileInputStream fileInputStream =  new FileInputStream("D:\\44\\alibaba-java.docx")) {

            Document document = new ApacheTikaDocumentParser().parse(fileInputStream);
            // 将文档内容嵌入并存储到embeddingStore中
            EmbeddingStoreIngestor.ingest(document, embeddingStore);

            // 使用聊天助手查询特定问题
            String result = chatAssistant.chat("错误码00000和A0001分别是什么");
            System.out.println(result);

            return result;


        } catch (IOException e) {
            e.printStackTrace();
        }



    }

}